home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / nos042_s / smisc.c < prev    next >
C/C++ Source or Header  |  1994-09-16  |  5KB  |  258 lines

  1. /* Miscellaneous Internet servers: discard, echo and remote
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  *
  4.  * ATARI Version by David Nash - dnash@chaos.demon.co.uk
  5.  *
  6.  * Add __stdargs to discserv, echoserv
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include "global.h"
  11. #include "mbuf.h"
  12. #include "socket.h"
  13. #include "proc.h"
  14. #include "remote.h"
  15. #include "smtp.h"
  16. #include "tcp.h"
  17. #include "commands.h"
  18. #include "hardware.h"
  19. #include "mailbox.h"
  20.  
  21. char *Rempass = "";    /* Remote access password */
  22.  
  23. static int chkrpass __ARGS((struct mbuf *bp));
  24. static void __stdargs discserv __ARGS((int s,void *unused,void *p));
  25. static void __stdargs echoserv __ARGS((int s,void *unused,void *p));
  26.  
  27. static int Rem = -1;
  28. static int Sdisc = -1;
  29. static int Secho = -1;
  30.  
  31. /* Start up TCP discard server */
  32. int
  33. dis1(argc,argv,p)
  34. int argc;
  35. char *argv[];
  36. void *p;
  37. {
  38.     struct sockaddr_in lsocket;
  39.     int s;
  40.  
  41.     if(Sdisc != -1){
  42.         return 0;
  43.     }
  44.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  45.     chname(Curproc,"Discard listener");
  46.  
  47.     lsocket.sin_family = AF_INET;
  48.     lsocket.sin_addr.s_addr = INADDR_ANY;
  49.     if(argc < 2)
  50.         lsocket.sin_port = IPPORT_DISCARD;
  51.     else
  52.         lsocket.sin_port = atoi(argv[1]);
  53.     Sdisc = socket(AF_INET,SOCK_STREAM,0);
  54.     bind(Sdisc,(char *)&lsocket,sizeof(lsocket));
  55.     listen(Sdisc,1);
  56.     for(;;){
  57.         if((s = accept(Sdisc,NULLCHAR,(int *)NULL)) == -1)
  58.             break;    /* Service is shutting down */
  59.  
  60.         if(availmem() < Memthresh){
  61.             shutdown(s,1);
  62.         } else
  63.             /* Spawn a server */
  64.             newproc("Discard server",576,discserv,s,NULL,NULL,0);
  65.     }
  66.     return 0;
  67. }
  68. static void
  69. __stdargs discserv(s,unused,p)
  70. int s;
  71. void *unused;
  72. void *p;
  73. {
  74.     struct mbuf *bp;
  75.  
  76.     sockowner(s,Curproc);
  77.     log(s,"open discard");
  78.     while(recv_mbuf(s,&bp,0,NULLCHAR,NULL) > 0)
  79.         free_p(bp);
  80.     log(s,"close discard");
  81.     close_s(s);
  82. }
  83. /* Stop discard server */
  84. int
  85. dis0(argc,argv,p)
  86. int argc;
  87. char *argv[];
  88. void *p;
  89. {
  90.     close_s(Sdisc);
  91.     Sdisc = -1;
  92.     return 0;
  93. }
  94. /* Start up TCP echo server */
  95. int
  96. echo1(argc,argv,p)
  97. int argc;
  98. char *argv[];
  99. void *p;
  100. {
  101.     struct sockaddr_in lsocket;
  102.     int s;
  103.  
  104.     if(Secho != -1){
  105.         return 0;
  106.     }
  107.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  108.     chname(Curproc,"Echo listener");
  109.  
  110.     lsocket.sin_family = AF_INET;
  111.     lsocket.sin_addr.s_addr = INADDR_ANY;
  112.     if(argc < 2)
  113.         lsocket.sin_port = IPPORT_ECHO;
  114.     else
  115.         lsocket.sin_port = atoi(argv[1]);
  116.     Secho = socket(AF_INET,SOCK_STREAM,0);
  117.     bind(Secho,(char *)&lsocket,sizeof(lsocket));
  118.     listen(Secho,1);
  119.     for(;;){
  120.         if((s = accept(Secho,NULLCHAR,(int *)NULL)) == -1)
  121.             break;    /* Service is shutting down */
  122.  
  123.         if(availmem() < Memthresh){
  124.             shutdown(s,1);
  125.         } else
  126.             /* Spawn a server */
  127.             newproc("Echo server",2048,echoserv,s,NULL,NULL,0);
  128.     }
  129.     return 0;
  130. }
  131. static void
  132. __stdargs echoserv(s,unused,p)
  133. int s;
  134. void *unused;
  135. void *p;
  136. {
  137.     struct mbuf *bp;
  138.  
  139.     sockowner(s,Curproc);
  140.     log(s,"open echo");
  141.     while(recv_mbuf(s,&bp,0,NULLCHAR,NULL) > 0)
  142.         send_mbuf(s,bp,0,NULLCHAR,0);
  143.  
  144.     log(s,"close echo");
  145.     close_s(s);
  146. }
  147. /* stop echo server */
  148. int
  149. echo0(argc,argv,p)
  150. int argc;
  151. char *argv[];
  152. void *p;
  153. {
  154.     close_s(Secho);
  155.     Secho = -1;
  156.     return 0;
  157. }
  158. /* Start remote exit/reboot server */
  159. int
  160. rem1(argc,argv,p)
  161. int argc;
  162. char *argv[];
  163. void *p;
  164. {
  165.     struct sockaddr_in lsocket,fsock;
  166.     int i;
  167.     int command;
  168.     struct mbuf *bp;
  169.     int32 addr;
  170.  
  171.     if(Rem != -1){
  172.         return 0;
  173.     }
  174.     psignal(Curproc,0);
  175.     chname(Curproc,"Remote listener");
  176.     lsocket.sin_family = AF_INET;
  177.     lsocket.sin_addr.s_addr = INADDR_ANY;
  178.     if(argc < 2)
  179.         lsocket.sin_port = IPPORT_REMOTE;
  180.     else
  181.         lsocket.sin_port = atoi(argv[1]);
  182.     
  183.     Rem = socket(AF_INET,SOCK_DGRAM,0);
  184.     bind(Rem,(char *)&lsocket,sizeof(lsocket));
  185.     for(;;){
  186.         i = sizeof(fsock);
  187.         if(recv_mbuf(Rem,&bp,0,(char *)&fsock,&i) == -1)
  188.             break;
  189.         command = PULLCHAR(&bp);
  190.  
  191.         switch(command){
  192. #ifdef    MSDOS    /* Only present on PCs running MSDOS */
  193.         case SYS_RESET:
  194.             i = chkrpass(bp);
  195.             log(Rem,"%s - Remote reset %s",
  196.              psocket((struct sockaddr *)&fsock),
  197.              i == 0 ? "PASSWORD FAIL" : "" );
  198.             if(i != 0){
  199.                 iostop();
  200.                 sysreset();    /* No return */
  201.             }
  202.             break;
  203. #endif
  204.         case SYS_EXIT:
  205.             i = chkrpass(bp);
  206.             log(Rem,"%s - Remote exit %s",
  207.              psocket((struct sockaddr *)&fsock),
  208.              i == 0 ? "PASSWORD FAIL" : "" );
  209.             if(i != 0){
  210.                 iostop();
  211.                 exit(0);
  212.             }
  213.             break;
  214.         case KICK_ME:
  215.             if(len_p(bp) >= sizeof(int32))
  216.                 addr = pull32(&bp);
  217.             else
  218.                 addr = fsock.sin_addr.s_addr;
  219.             kick(addr);
  220.             smtptick((void *)addr);
  221.             break;
  222.         }
  223.         free_p(bp);
  224.     }
  225.     close_s(Rem);
  226.     Rem = -1;
  227.     return 0;
  228. }
  229. /* Check remote password */
  230. static int
  231. chkrpass(bp)
  232. struct mbuf *bp;
  233. {
  234.     char *lbuf;
  235.     int16 len;
  236.     int rval = 0;
  237.  
  238.     len = len_p(bp);
  239.     if(strlen(Rempass) != len)
  240.         return rval;
  241.     lbuf = mallocw(len);
  242.     pullup(&bp,lbuf,len);
  243.     if(strncmp(Rempass,lbuf,len) == 0)
  244.         rval = 1;
  245.     free(lbuf);
  246.     return rval;
  247. }
  248. int
  249. rem0(argc,argv,p)
  250. int argc;
  251. char *argv[];
  252. void *p;
  253. {
  254.     close_s(Rem);
  255.     return 0;
  256. }
  257.  
  258.